﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
/*
 virtual - override
 * 1-
 Egerki anasinif ile tureyen sinifta ayni isimde metod varsa
 tureyen siniftan nesne tanimlandiginda anasinif objeside olusacagindan 
 ve biz tureyen siniftaki anasinifla ayni isimdeki (ayni geri donus arg sayisi vs) metodu cagirdigimizda
 eger metodlarda virtual-override tanimi yapilmamissa, anasinifin metodu cagrilacak
 
 */
namespace VirtualOverrideAnlama
{

    class Anasinif
    {
        public Anasinif()
        {
            Console.WriteLine("Anasinif ctor");
        }
        public virtual void IslemYap()
        {
            Console.WriteLine("Anasiniftan islem yapar");
        }
        ~Anasinif()
        {
            Console.WriteLine("Anasinif yikildi");
        }
    }
    class Tureyen:Anasinif
    {
        public Tureyen()
        {
            Console.WriteLine("Tureyensinif ctor");
        }

        public override void IslemYap()
        {
            Console.WriteLine("Tureyensiniftan islem yapar");
        }
    }
    class Program
    {
        static void Main(string[] args)
        {
            #region CommentYap
            //Basit sekilde tureyen sinifi new ile hafizada olusturdugumuzda
            //Anasinif ve Tureyen objeleri olusur!
            new Tureyen();
            /* output:
               Anasinif ctor
               Tureyensinif ctor
             */
            //o halde
            Console.WriteLine("-------------------------"); 
            #endregion
            Anasinif s = new Tureyen(); //==> her iki Anasinif ve Tureyensinif objeleri olusacak s e atanan Anasinif objesi
            //cunku
            s.IslemYap(); //=> Sonuc Anasinifin IslemYap() metod sonucdur.
            Console.WriteLine("-------------------------");
            //Peki Tureyen deki IslemYap metodunu cagirmak istersem, yapilacaklar
            //1
            Tureyen tr = (Tureyen)s;
            tr.IslemYap(); //=> Sonuc: Tureyensinifin IslemYap() metod sonucudur.
            //Peki (Tureyen)s deki casting sonucunda Anasinif objesi ne olur? yikici metodu ekleyerek anlayalim.
            //Programi CommentYap i commetn yaparak calistirildiginda Castin aninda Anasinifin yikildigi Gorulur!

            Console.WriteLine("--------virtual override tanimladiktan sonra--------");
            //2
            //yada
            //Anasiniftaki metodu virtual, Tureyen siniftaki metoduda override olarak tanimlamaliyim.
            s.IslemYap();  //=>Sonuc: Tureyensinifin IslemYap() metod sonucudur.


            //3
            //yada
            //virtual override yerine Tureyen siniftaki metoda public new void IslemYap() seklinde Anasiniftaki metodu gizlerdik
            //Buraya kadar sorun yoksa mutlaka VirtualOverrideAnlama2 ye bak!
        }
    }
}
